package com.tool.cn.use.task;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tool.cn.util.StringUtil;


/**
 * 
 * @author wangzonghui
 * @date 2020年6月3日 下午2:10:50 
 * @Description:任务控制类
 */
public class TaskControl {
	
	private static Logger log= LoggerFactory.getLogger(TaskControl.class);

	/**
	 * 任务处理入口
	 */
	public void runTask() {
		DataModelUtil dataModel=new DataModelUtil();		
		
		int poolSize=5; //线程池大小
		ExecutorService pool = Executors.newFixedThreadPool(poolSize);
		
		try {
			//提交执行任务
			int size=10;
			for(int i =0;i<size;i++) {
				/**
				 * 1、execute 提交Runable类型任务，submit支持Runnable和Callable任务
				 * 2、execute 直接跑出异常，submit吃掉异常，可通过Future的get方法将任务执行时异常重新抛出。
				 * 3、execute所属顶层接口是Executor,submit所属顶层接口是ExecutorService，实现类ThreadPoolExecutor重写了execute方法,抽象类AbstractExecutorService重写了submit方法。
				 * 个人感觉 execute速度快于submit
				 */
				pool.execute(new RequestThread(dataModel));  
			}
			
			//等待处理结果
			int servercount = 0;
			while(dataModel.getList().size()!=size){
				if(dataModel.getList().size()>servercount){					
					log.info((size-servercount)+" servers not return...");
					servercount = dataModel.getList().size();
				}
				Thread.sleep(10);
				continue;
			}
			
			List<String> data=dataModel.getList();
			data=data.stream().filter(temp -> StringUtil.isNotEmpty(temp)).collect(Collectors.toList());  //只提取非空结果
		} catch (Exception e) {
			log.error("Task Error "+e.toString(),e);
		}finally {
			pool.shutdown();
		}
	}
}
